perm filename HIGH.L[FTL,LSP] blob sn#826390 filedate 1986-10-21 generic text, type T, neo UTF8
;;;-*-Mode:LISP; Package:(PCL (LISP WALKER)); Base:10; Syntax:Common-lisp -*-
;;;
;;; *************************************************************************
;;; Copyright (c) 1985 Xerox Corporation.  All rights reserved.
;;;
;;; Use and copying of this software and preparation of derivative works
;;; based upon this software are permitted.  Any distribution of this
;;; software or derivative works must comply with all applicable United
;;; States export control laws.
;;; 
;;; This software is made available AS IS, and Xerox Corporation makes no
;;; warranty about the software, its performance or its conformity to any
;;; specification.
;;; 
;;; Any person obtaining a copy of this software is requested to send their
;;; name and post office or electronic mail address to:
;;;   CommonLoops Coordinator
;;;   Xerox Artifical Intelligence Systems
;;;   2400 Hanover St.
;;;   Palo Alto, CA 94303
;;; (or send Arpanet mail to CommonLoops-Coordinator.pa@Xerox.arpa)
;;;
;;; Suggestions, comments and requests for improvements are also welcome.
;;; *************************************************************************
;;;
;;; Non-Bootstrap stuff
;;;

(in-package 'pcl :nicknames '(portable-commonloops))


(ndefstruct (obsolete-class (:class class)
                            (:include (class))))


(defmeth get-slot-using-class ((class obsolete-class)
			       object slot-name
			       dont-call-slot-missing-p
			       default)
  (change-class object
		(cadr (get-slot class 'class-precedence-list)))
  (get-slot-using-class
    (class-of object) object slot-name dont-call-slot-missing-p default))


  ;;   
;;;;;; 
  ;;   


(defmeth describe-class (class-or-class-name
			  &optional (stream *standard-output*))
  (flet ((pretty-class (class) (or (class-name class) class)))
    (if (symbolp class-or-class-name)
	(describe-class (class-named class-or-class-name) stream)
	(let ((class class-or-class-name))
	  (format stream
		  "~&The class ~S is an instance of class ~S."
		  class
		  (class-of class))
	  (format stream "~&Name:~23T~S~%~
			    Class-Precedence-List:~23T~S~%~
                            Local-Supers:~23T~S~%~
                            Direct-Subclasses:~23T~S"
		  (class-name class)
		  (mapcar #'pretty-class (class-class-precedence-list class))
		  (mapcar #'pretty-class (class-local-supers class))
		  (mapcar #'pretty-class (class-direct-subclasses class)))
	  class))))

(defun describe-instance (object &optional (stream t))
  (let* ((class (class-of object))
         (instance-slots (class-instance-slots class))
         (non-instance-slots (class-non-instance-slots class))
         (dynamic-slots (iwmc-class-dynamic-slots object))
	 (max-slot-name-length 0))
    (macrolet ((adjust-slot-name-length (name)
		 `(setq max-slot-name-length
			(max max-slot-name-length
			     (length (the string (symbol-name ,name))))))
	       (describe-slot (name value &optional (allocation () alloc-p))
		 (if alloc-p
		     `(format stream
			      "~% ~A ~S ~VT  ~S"
			      ,name ,allocation (+ max-slot-name-length 7)
			      ,value)
		     `(format stream
			      "~% ~A~VT  ~S"
			      ,name max-slot-name-length ,value))))
      ;; Figure out a good width for the slot-name column.
      (iterate ((slotd in instance-slots))
	(adjust-slot-name-length (slotd-name slotd)))      
      (iterate ((slotd in non-instance-slots))
	(adjust-slot-name-length (slotd-name slotd)))
      (iterate ((name in dynamic-slots by cddr))
	(adjust-slot-name-length name))
      (setq max-slot-name-length  (min (+ max-slot-name-length 3) 30))
      (format stream "~%~S is an instance of class ~S:" object class)
      (format stream "~% The following slots are allocated in the instance ~
                         (:INSTANCE allocation):")
      (iterate ((slotd in instance-slots))
	(let ((name (slotd-name slotd)))
	  (describe-slot name (get-slot object name))))
      (when (or dynamic-slots
		(iterate ((slotd in non-instance-slots))
		  (when (neq (slotd-allocation slotd) :dynamic) (return t))))
	(format stream
		"~%The following slots have special allocations as shown:")
	(iterate ((slotd in non-instance-slots))
	  (unless (eq (slotd-allocation slotd) :dynamic)
	    (describe-slot (slotd-name slotd)
			   (get-slot object (slotd-name slotd))
			   (slotd-allocation slotd))))
	(iterate ((name in dynamic-slots by cddr)
		  (val in (cdr dynamic-slots) by cddr))
	  (describe-slot name val :dynamic)))))
  object)


  ;;   
;;;;;; 
  ;;   

(ndefstruct (structure-metaclass (:class class)
				 (:include class)
				 (:constructor nil)))

(defmeth expand-defstruct ((class structure-metaclass)
			   name-and-options doc slot-descriptions)
  (ignore class doc)
  (let ((class-argument (iterate ((option in (cdr name-and-options)))
				 (when (and (listp option)
					    (eq (car option) ':class))
				   (return option)))))
    `(defstruct ,(remove class-argument name-and-options)
       . ,slot-descriptions)))


  ;;   
;;;;;; 
  ;;   

(eval-when (compile load eval)
(ndefstruct (built-in (:class class)
		      (:include (class))))

(ndefstruct (built-in-with-fast-type-predicate (:class class)
					       (:include (built-in))))

(defmacro define-built-in-class (name includes &optional fast-type-predicate)
  `(ndefstruct (,name (:class ,(if fast-type-predicate
				   'built-in-with-fast-type-predicate
				   'built-in))
		      (:include ,includes))
     (fast-type-predicate ',fast-type-predicate)  ;;;

     ))

(defmeth parse-defstruct-options ((class built-in) name options)
  (let ((ds-options (run-super)))
    (or (ds-options-includes ds-options)
	(setf (ds-options-includes ds-options) (list 'object)))
    ds-options))

(defmeth expand-defstruct-make-definitions ((class built-in)
					    name ds-options slotds)
  (ignore class name ds-options slotds)
  ())

(defmeth make-instance ((class built-in))
  (ignore class)
  (error
    "Attempt to make an instance of the built-in class ~S.~%~
     Currently it is not possible to make instance of built-in classes with~
     make.~%~
     A design for this exists, because of metaclasses it is easy to do,~%~
     it just has to be done."
    class))

(defmeth compatible-meta-class-change-p
	 ((from built-in)
	  (to built-in-with-fast-type-predicate))
  (ignore from to)
  t)

(defmeth check-super-meta-class-compatibility ((built-in built-in)
					       (new-super class))
  (or (eq new-super (class-named 't))
      (error "~S cannot have ~S as a super.~%~
              The only meta-class CLASS class that a built-in class can~%~
              have as a super is the class T."
	     built-in new-super)))



(defmeth check-super-meta-class-compatibility
	 ((class built-in)
	  (new-local-super built-in))
  (ignore class new-local-super)
  t)

;(defmeth check-super-meta-class-compatibility
;	 ((class built-in-with-fast-type-predicate)
;	  (new-local-super built-in))
;  (ignore class new-local-super)
;  t)

(defmeth compute-class-precedence-list ((class built-in) local-supers)
  ;; Compute the class-precedence list just like we do for CLASS except that
  ;; a built-in class cannot inherit COMMON from another built-in class.  But
  ;; it does inherit the things that it would have inherited had it inherited
  ;; common.
  (let ((val (run-super))
	(common-class nil))
    (if (not (memq (setq common-class (class-named 'common t)) local-supers))
	(remove common-class val)
	val)))

)

  ;;   
;;;;;; The built in types 
  ;;   

(define-built-in-class common (t))

(define-built-in-class pathname (common) pathnamep)

(define-built-in-class stream (common) streamp)

(define-built-in-class sequence (t))
(define-built-in-class list (sequence) listp)
(define-built-in-class cons (list common) consp)
(define-built-in-class symbol (common) symbolp)
(define-built-in-class null (list symbol) null)

(define-built-in-class array (common) arrayp)
(define-built-in-class vector (sequence array) vectorp)
(define-built-in-class simple-array (array))

(define-built-in-class string (vector common) stringp)
(define-built-in-class bit-vector (vector) bit-vector-p)
;(vector t) should go here

(define-built-in-class simple-string (string simple-array) simple-string-p)
(define-built-in-class simple-bit-vector (bit-vector simple-array)
					 simple-bit-vector-p)
(define-built-in-class simple-vector (vector simple-array) simple-vector-p)

(define-built-in-class function (t))

(define-built-in-class character (t) characterp)
(define-built-in-class string-char (character) string-char-p)
(define-built-in-class standard-char (string-char common) standard-char-p)

(define-built-in-class structure (common))

(define-built-in-class number (t) numberp)

(define-built-in-class rational (number) rationalp)
(define-built-in-class float (number) floatp)
(define-built-in-class complex (number common) complexp)

(define-built-in-class integer (rational))
(define-built-in-class ratio   (rational common))

(define-built-in-class fixnum (integer common))
(define-built-in-class bignum (integer common))

(define-built-in-class short-float  (float common))
(define-built-in-class single-float (float common))
(define-built-in-class double-float (float common))
(define-built-in-class long-float   (float common))

(define-built-in-class hash-table (common) hash-table-p)
(define-built-in-class readtable (common) readtablep)
(define-built-in-class package (common) packagep)
(define-built-in-class random-state (common) random-state-p)